import type { RouteRecordRaw, RouteMeta } from 'vue-router';
import { RoleEnum } from '/@/enums/roleEnum';
import { defineComponent } from 'vue';

export type Component<T = any> =
   | ReturnType<typeof defineComponent>
   | (() => Promise<typeof import('*.vue')>)
   | (() => Promise<T>);

// @ts-ignore
export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
   name: string;
   meta: RouteMeta;
   component?: Component | string;
   components?: Component;
   children?: AppRouteRecordRaw[];
   props?: Recordable;
   fullPath?: string;
}

export interface MenuTag {
   type?: 'primary' | 'error' | 'warn' | 'success';
   content?: string;
   dot?: boolean;
}

export interface Menu {
   name: string;

   icon?: string;

   path: string;

   // path contains param, auto assignment.
   paramPath?: string;

   disabled?: boolean;

   children?: Menu[];

   orderNo?: number;

   roles?: RoleEnum[];

   meta?: Partial<RouteMeta>;

   tag?: MenuTag;

   hideMenu?: boolean;
}

export interface MenuModule {
   orderNo?: number;
   menu: Menu;
}

// export type AppRouteModule = RouteModule | AppRouteRecordRaw;
export type AppRouteModule = AppRouteRecordRaw;
